self-evolve-framework 1.0.7 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -8
- package/bin/cli.js +63 -35
- package/package.json +1 -1
- package/template/rules/CodeGraph.mdc +23 -0
- package/template/rules/Svelte_5.mdc +167 -0
- package/template/rules/Svelte_Flow.mdc +176 -0
- package/template/rules/Tailwind_CSS_v4.mdc +187 -0
- package/template/rules/Tauri.mdc +145 -0
- package/template/rules/app-error-pattern.mdc +65 -0
- package/template/rules/invoke-safe-pattern.mdc +53 -0
- package/template/rules/js.mdc +10 -0
- package/template/rules/powershell.mdc +9 -0
- package/template/rules/self-evolve.mdc +4 -4
- package/template/rules//346/227/245/345/277/227.mdc +15 -0
- package/template/rules//350/257/267/346/261/202.mdc +49 -0
- package/template/skills/caveman/SKILL.md +49 -0
- package/template/skills/check/SKILL.md +393 -0
- package/template/skills/check/agents/reviewer-architecture.md +39 -0
- package/template/skills/check/agents/reviewer-security.md +39 -0
- package/template/skills/check/references/persona-catalog.md +56 -0
- package/template/skills/check/references/project-context.md +120 -0
- package/template/skills/check/references/public-reply.md +14 -0
- package/template/skills/check/scripts/audit_signals.py +666 -0
- package/template/skills/check/scripts/run-tests.sh +19 -0
- package/template/skills/design/SKILL.md +173 -0
- package/template/skills/design/references/design-aesthetic-quality.md +67 -0
- package/template/skills/design/references/design-data-viz.md +34 -0
- package/template/skills/design/references/design-reference.md +295 -0
- package/template/skills/design/references/design-tokens.md +45 -0
- package/template/skills/design/references/design-traps.md +43 -0
- package/template/skills/design-an-interface/SKILL.md +94 -0
- package/template/skills/diagnose/SKILL.md +117 -0
- package/template/skills/diagnose/scripts/hitl-loop.template.sh +41 -0
- package/template/skills/edit-article/SKILL.md +14 -0
- package/template/skills/git-guardrails-claude-code/SKILL.md +95 -0
- package/template/skills/git-guardrails-claude-code/scripts/block-dangerous-git.sh +25 -0
- package/template/skills/grill-me/SKILL.md +10 -0
- package/template/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/template/skills/grill-with-docs/CONTEXT-FORMAT.md +60 -0
- package/template/skills/grill-with-docs/SKILL.md +88 -0
- package/template/skills/handoff/SKILL.md +15 -0
- package/template/skills/health/SKILL.md +260 -0
- package/template/skills/health/agents/inspector-context.md +119 -0
- package/template/skills/health/agents/inspector-control.md +84 -0
- package/template/skills/health/agents/inspector-maintainability.md +55 -0
- package/template/skills/health/scripts/check-agent-context.sh +5 -0
- package/template/skills/health/scripts/check-doc-refs.sh +8 -0
- package/template/skills/health/scripts/check-maintainability.sh +8 -0
- package/template/skills/health/scripts/check-verifier-output.sh +5 -0
- package/template/skills/health/scripts/check_agent_context.py +444 -0
- package/template/skills/health/scripts/check_doc_refs.py +110 -0
- package/template/skills/health/scripts/check_maintainability.py +635 -0
- package/template/skills/health/scripts/check_verifier_output.py +116 -0
- package/template/skills/health/scripts/collect-data.sh +751 -0
- package/template/skills/hunt/SKILL.md +232 -0
- package/template/skills/hunt/references/failure-patterns.md +138 -0
- package/template/skills/hunt/references/ime-unicode.md +58 -0
- package/template/skills/hunt/references/logging-techniques.md +72 -0
- package/template/skills/hunt/references/rendering-debug.md +34 -0
- package/template/skills/impeccable/SKILL.md +47 -0
- package/template/skills/improve-codebase-architecture/DEEPENING.md +37 -0
- package/template/skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/template/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +44 -0
- package/template/skills/improve-codebase-architecture/LANGUAGE.md +53 -0
- package/template/skills/improve-codebase-architecture/SKILL.md +81 -0
- package/template/skills/learn/SKILL.md +140 -0
- package/template/skills/migrate-to-shoehorn/SKILL.md +118 -0
- package/template/skills/obsidian-vault/SKILL.md +59 -0
- package/template/skills/prototype/LOGIC.md +79 -0
- package/template/skills/prototype/SKILL.md +30 -0
- package/template/skills/prototype/UI.md +112 -0
- package/template/skills/qa/SKILL.md +130 -0
- package/template/skills/read/SKILL.md +141 -0
- package/template/skills/read/references/read-methods.md +129 -0
- package/template/skills/read/scripts/fetch.sh +106 -0
- package/template/skills/read/scripts/fetch_feishu.py +251 -0
- package/template/skills/read/scripts/fetch_local.py +218 -0
- package/template/skills/read/scripts/fetch_weixin.py +107 -0
- package/template/skills/request-refactor-plan/SKILL.md +68 -0
- package/template/skills/review/SKILL.md +78 -0
- package/template/skills/rust-auto-fix/SKILL.md +94 -0
- package/template/skills/scaffold-exercises/SKILL.md +106 -0
- package/template/skills/sdd-dev/SKILL.md +114 -0
- package/template/skills/setup-matt-pocock-skills/SKILL.md +121 -0
- package/template/skills/setup-matt-pocock-skills/domain.md +51 -0
- package/template/skills/setup-matt-pocock-skills/issue-tracker-github.md +22 -0
- package/template/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +23 -0
- package/template/skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/template/skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/template/skills/setup-pre-commit/SKILL.md +91 -0
- package/template/skills/skillopt-sleep/SKILL.md +1 -1
- package/template/skills/svelte-warnings-fix/SKILL.md +94 -0
- package/template/skills/tauri-nsis-installer-icon/SKILL.md +92 -0
- package/template/skills/tauri-nsis-installer-icon/references/tauri-nsis-schema.md +71 -0
- package/template/skills/tb/SKILL.md +62 -0
- package/template/skills/tdd/SKILL.md +109 -0
- package/template/skills/tdd/deep-modules.md +33 -0
- package/template/skills/tdd/interface-design.md +31 -0
- package/template/skills/tdd/mocking.md +59 -0
- package/template/skills/tdd/refactoring.md +10 -0
- package/template/skills/tdd/tests.md +61 -0
- package/template/skills/teach/GLOSSARY-FORMAT.md +35 -0
- package/template/skills/teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/template/skills/teach/MISSION-FORMAT.md +31 -0
- package/template/skills/teach/RESOURCES-FORMAT.md +32 -0
- package/template/skills/teach/SKILL.md +91 -0
- package/template/skills/think/SKILL.md +184 -0
- package/template/skills/to-issues/SKILL.md +83 -0
- package/template/skills/to-prd/SKILL.md +74 -0
- package/template/skills/triage/AGENT-BRIEF.md +168 -0
- package/template/skills/triage/OUT-OF-SCOPE.md +101 -0
- package/template/skills/triage/SKILL.md +103 -0
- package/template/skills/ubiquitous-language/SKILL.md +93 -0
- package/template/skills/ver/SKILL.md +62 -0
- package/template/skills/write/SKILL.md +209 -0
- package/template/skills/write/references/write-en.md +199 -0
- package/template/skills/write/references/write-product-localization.md +43 -0
- package/template/skills/write/references/write-zh-bilingual.md +59 -0
- package/template/skills/write/references/write-zh-prose.md +50 -0
- package/template/skills/write/references/write-zh-release-notes.md +40 -0
- package/template/skills/write/references/write-zh.md +721 -0
- package/template/skills/write-a-skill/SKILL.md +117 -0
- package/template/skills/writing-beats/SKILL.md +52 -0
- package/template/skills/writing-fragments/SKILL.md +75 -0
- package/template/skills/writing-shape/SKILL.md +64 -0
- package/template/skills/zoom-out/SKILL.md +7 -0
package/README.md
CHANGED
|
@@ -45,13 +45,15 @@ npx self-evolve-framework init --skip-impeccable
|
|
|
45
45
|
│ ├── self-evolve.mdc ← 编排层(always 激活)
|
|
46
46
|
│ └── ponytail.mdc ← 代码最小化原则
|
|
47
47
|
├── skills/
|
|
48
|
-
│
|
|
49
|
-
│
|
|
48
|
+
│ ├── skillopt-sleep/
|
|
49
|
+
│ │ └── SKILL.md ← 离线进化分析
|
|
50
|
+
│ └── impeccable/
|
|
51
|
+
│ └── SKILL.md ← 设计质量审计
|
|
50
52
|
CLAUDE.md ← 追加自我进化章节
|
|
51
53
|
```
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
> 可选:用 `--skip-impeccable` 跳过 Impeccable skill 安装。
|
|
56
|
+
> 首次使用前在 CodeBuddy 对话中输入 `impeccable init` 创建设计上下文。
|
|
55
57
|
|
|
56
58
|
## 使用
|
|
57
59
|
|
|
@@ -78,7 +80,7 @@ impeccable polish → 页面润色
|
|
|
78
80
|
|
|
79
81
|
### 设计上下文
|
|
80
82
|
|
|
81
|
-
|
|
83
|
+
在 CodeBuddy 对话中输入 `impeccable init` 生成 `PRODUCT.md` 和 `DESIGN.md`,让后续审计更精准。
|
|
82
84
|
|
|
83
85
|
## 前提
|
|
84
86
|
|
|
@@ -91,13 +93,15 @@ Impeccable 首次使用前运行 `/impeccable init` 生成 `PRODUCT.md` 和 `DES
|
|
|
91
93
|
```
|
|
92
94
|
self-evolve-framework/
|
|
93
95
|
├── package.json # npm 包配置
|
|
94
|
-
├── bin/cli.js # CLI
|
|
96
|
+
├── bin/cli.js # CLI 安装工具
|
|
95
97
|
├── template/
|
|
96
98
|
│ ├── rules/
|
|
97
99
|
│ │ ├── self-evolve.mdc ← 编排层(含 Impeccable 集成)
|
|
98
100
|
│ │ └── ponytail.mdc
|
|
99
101
|
│ └── skills/
|
|
100
|
-
│
|
|
101
|
-
│
|
|
102
|
+
│ ├── skillopt-sleep/
|
|
103
|
+
│ │ └── SKILL.md ← 离线进化引擎(含设计质量分析)
|
|
104
|
+
│ └── impeccable/
|
|
105
|
+
│ └── SKILL.md ← 设计质量审计 skill
|
|
102
106
|
└── README.md
|
|
103
107
|
```
|
package/bin/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync } from "fs"
|
|
3
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, cpSync, readdirSync, statSync } from "fs"
|
|
4
4
|
import { join, resolve } from "path"
|
|
5
5
|
import { fileURLToPath } from "url"
|
|
6
6
|
|
|
@@ -9,13 +9,17 @@ const TEMPLATE_DIR = resolve(__dirname, "../template")
|
|
|
9
9
|
|
|
10
10
|
const COMMANDS = {
|
|
11
11
|
init: {
|
|
12
|
-
desc: "
|
|
12
|
+
desc: "一键安装全部 CodeBuddy skill + 规则到当前项目",
|
|
13
13
|
run: async (args) => init(args),
|
|
14
14
|
},
|
|
15
15
|
sync: {
|
|
16
|
-
desc: "
|
|
16
|
+
desc: "从框架项目同步最新的 skill + 规则到当前项目",
|
|
17
17
|
run: async (args) => sync(args),
|
|
18
18
|
},
|
|
19
|
+
list: {
|
|
20
|
+
desc: "列出模板中包含的所有 skill 和规则",
|
|
21
|
+
run: () => listSkills(),
|
|
22
|
+
},
|
|
19
23
|
help: {
|
|
20
24
|
desc: "显示帮助信息",
|
|
21
25
|
run: () => showHelp(),
|
|
@@ -27,22 +31,49 @@ function showHelp() {
|
|
|
27
31
|
self-evolve — CodeBuddy 自我进化飞轮安装工具
|
|
28
32
|
|
|
29
33
|
用法:
|
|
30
|
-
npx self-evolve-framework init
|
|
31
|
-
npx self-evolve-framework
|
|
34
|
+
npx self-evolve-framework init 一键安装全部 skill + 规则
|
|
35
|
+
npx self-evolve-framework list 列出模板中包含的所有 skill
|
|
36
|
+
npx self-evolve-framework sync 从框架同步最新版本
|
|
32
37
|
|
|
33
38
|
选项:
|
|
34
39
|
--project <path> 指定目标项目路径(默认当前目录)
|
|
35
40
|
--skip-claude-md 跳过更新 CLAUDE.md
|
|
36
|
-
--skip-impeccable
|
|
41
|
+
--skip-impeccable 跳过 Impeccable 设计质量 skill
|
|
37
42
|
--dry-run 预览要复制的文件,不实际写入
|
|
38
43
|
|
|
39
44
|
示例:
|
|
40
45
|
npx self-evolve-framework init
|
|
41
46
|
npx self-evolve-framework init --project ./my-app
|
|
42
|
-
npx self-evolve-framework init --skip-claude-md --
|
|
47
|
+
npx self-evolve-framework init --skip-claude-md --dry-run
|
|
43
48
|
`)
|
|
44
49
|
}
|
|
45
50
|
|
|
51
|
+
function listSkills() {
|
|
52
|
+
const rulesDir = resolve(TEMPLATE_DIR, "rules")
|
|
53
|
+
const skillsDir = resolve(TEMPLATE_DIR, "skills")
|
|
54
|
+
console.log("\n📦 模板中包含的规则:")
|
|
55
|
+
if (existsSync(rulesDir)) {
|
|
56
|
+
for (const f of readdirSync(rulesDir).filter(f => f.endsWith(".mdc")).sort()) {
|
|
57
|
+
console.log(` rules/${f}`)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
console.log("\n🧠 模板中包含的技能:")
|
|
61
|
+
if (existsSync(skillsDir)) {
|
|
62
|
+
for (const d of readdirSync(skillsDir).filter(f => statSync(join(skillsDir, f)).isDirectory()).sort()) {
|
|
63
|
+
const skillMd = join(skillsDir, d, "SKILL.md")
|
|
64
|
+
let desc = ""
|
|
65
|
+
if (existsSync(skillMd)) {
|
|
66
|
+
const firstLine = readFileSync(skillMd, "utf-8").split("\n").find(l => l.startsWith("description:"))
|
|
67
|
+
if (firstLine) desc = firstLine.replace("description: ", "").trim()
|
|
68
|
+
}
|
|
69
|
+
console.log(` ${d}/ ${desc ? "— " + desc : ""}`)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!existsSync(rulesDir) && !existsSync(skillsDir)) {
|
|
73
|
+
console.log(" (模板目录为空)")
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
46
77
|
async function init(args) {
|
|
47
78
|
const baseDir = resolve(args["--project"] || process.cwd())
|
|
48
79
|
const dryRun = !!args["--dry-run"]
|
|
@@ -52,40 +83,36 @@ async function init(args) {
|
|
|
52
83
|
console.log(`📍 项目路径: ${baseDir}`)
|
|
53
84
|
console.log(`🧪 ${dryRun ? "DRY RUN — 不写入文件" : "执行中..."}\n`)
|
|
54
85
|
|
|
55
|
-
// 要复制的目录映射:{ 源相对路径 → 目标相对路径 }
|
|
56
|
-
const dirs = [
|
|
57
|
-
{ src: "rules", dest: ".codebuddy/rules" },
|
|
58
|
-
{ src: "skills/skillopt-sleep", dest: ".codebuddy/skills/skillopt-sleep" },
|
|
59
|
-
]
|
|
60
|
-
|
|
61
86
|
let count = 0
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (!dryRun)
|
|
67
|
-
|
|
68
|
-
|
|
87
|
+
|
|
88
|
+
// 复制 rules(排除 .mdc 文件可以在以后细化)
|
|
89
|
+
const rulesSrc = resolve(TEMPLATE_DIR, "rules")
|
|
90
|
+
if (existsSync(rulesSrc)) {
|
|
91
|
+
if (!dryRun) {
|
|
92
|
+
mkdirSync(resolve(baseDir, ".codebuddy/rules"), { recursive: true })
|
|
93
|
+
cpSync(rulesSrc, resolve(baseDir, ".codebuddy/rules"), { recursive: true, force: true })
|
|
94
|
+
}
|
|
95
|
+
const ruleFiles = readdirSync(rulesSrc).filter(f => f.endsWith(".mdc"))
|
|
96
|
+
console.log(` ${dryRun ? "🔍 将复制" : "✅ 复制"} rules/ → .codebuddy/rules/(${ruleFiles.length} 个规则)`)
|
|
69
97
|
count++
|
|
70
98
|
}
|
|
71
99
|
|
|
72
|
-
//
|
|
73
|
-
|
|
100
|
+
// 复制 skills(排除 impeccable 如果 --skip-impeccable)
|
|
101
|
+
const skillsSrc = resolve(TEMPLATE_DIR, "skills")
|
|
102
|
+
if (existsSync(skillsSrc)) {
|
|
103
|
+
const skillDirs = readdirSync(skillsSrc).filter(f =>
|
|
104
|
+
statSync(join(skillsSrc, f)).isDirectory() &&
|
|
105
|
+
!(skipImpeccable && f === "impeccable")
|
|
106
|
+
)
|
|
107
|
+
const skillsDest = resolve(baseDir, ".codebuddy/skills")
|
|
74
108
|
if (!dryRun) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
execSync("npx --yes impeccable install", { cwd: baseDir, stdio: "inherit" })
|
|
79
|
-
console.log(" ✅ Impeccable 安装完成")
|
|
80
|
-
console.log(" ℹ️ 运行 /impeccable init 创建设计上下文(DESIGN.md + PRODUCT.md)")
|
|
81
|
-
count++
|
|
82
|
-
} catch {
|
|
83
|
-
console.log(" ⚠️ Impeccable 安装失败(网络问题?),可稍后手动运行 npx impeccable install")
|
|
109
|
+
mkdirSync(skillsDest, { recursive: true })
|
|
110
|
+
for (const dir of skillDirs) {
|
|
111
|
+
cpSync(join(skillsSrc, dir), join(skillsDest, dir), { recursive: true, force: true })
|
|
84
112
|
}
|
|
85
|
-
} else {
|
|
86
|
-
console.log(" 🔍 将安装 Impeccable(npx impeccable install)")
|
|
87
|
-
count++
|
|
88
113
|
}
|
|
114
|
+
console.log(` ${dryRun ? "🔍 将复制" : "✅ 复制"} skills/ → .codebuddy/skills/(${skillDirs.length} 个技能)`)
|
|
115
|
+
count++
|
|
89
116
|
}
|
|
90
117
|
|
|
91
118
|
// 更新 CLAUDE.md
|
|
@@ -119,11 +146,12 @@ async function init(args) {
|
|
|
119
146
|
}
|
|
120
147
|
|
|
121
148
|
console.log(`\n${dryRun ? `🔍 预览完成,共 ${count} 项操作` : `✅ 已完成 ${count} 项操作 — 下次对话即可生效`}`)
|
|
122
|
-
if (!dryRun) {
|
|
149
|
+
if (!dryRun && count > 0) {
|
|
123
150
|
console.log("\n📖 使用指南(在 CodeBuddy 对话中输入):")
|
|
124
151
|
console.log(" skillopt-sleep dry-run → 每日健康检查")
|
|
125
152
|
console.log(" skillopt-sleep run → 周改进提案")
|
|
126
153
|
console.log(" impeccable audit/critique → 设计质量审查")
|
|
154
|
+
console.log(" npx self-evolve-framework list → 查看所有可用 skill")
|
|
127
155
|
}
|
|
128
156
|
}
|
|
129
157
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: CodeBuddy 工具使用指南 — 何时用哪个工具
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## CodeBuddy 代码探索指南
|
|
7
|
+
|
|
8
|
+
### 工具选择原则
|
|
9
|
+
|
|
10
|
+
| 问题类型 | 推荐工具 |
|
|
11
|
+
|---------|---------|
|
|
12
|
+
| "查找名为 X 的定义" | `search_content`(精确匹配)或 `task(code-explorer)`(范围探索) |
|
|
13
|
+
| "X 被哪些地方调用?" | `search_content` 搜索引用 + `codebase_search` 语义搜索 |
|
|
14
|
+
| "这个文件的结构是什么?" | `read_file` 读取文件 |
|
|
15
|
+
| "目录下有哪些文件?" | `list_dir` 或 `search_file` 通配符匹配 |
|
|
16
|
+
| "给我整个模块的上下文" | `task(code-explorer)` 子代理批量探索 |
|
|
17
|
+
|
|
18
|
+
### 规则
|
|
19
|
+
|
|
20
|
+
- **直接回答,不委托探索。** 对于架构问题,先 `read_file` 关键文件,再 `search_content` 追踪引用。不需要启动子代理来读文件。
|
|
21
|
+
- **优先精确匹配。** 知道符号名时用 `search_content`(正则匹配),不确定时用 `codebase_search`(语义搜索)。
|
|
22
|
+
- **批量读取优于多次单读。** 需要理解多个文件时一次 `read_file` 多文件,不要分多次调用。
|
|
23
|
+
- **`task(code-explorer)` 适合大范围代码探索**(跨多个目录、多个模式搜索),简单查找直接用 `search_content`。
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
enabled: true
|
|
5
|
+
updatedAt: 2026-05-13T05:27:41.155Z
|
|
6
|
+
provider:
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Svelte 5 项目编码规范(100% 严格遵循 Svelte 官方最新标准)
|
|
10
|
+
完全遵循 Svelte 5 官方文档、官方最佳实践、$ 响应式规范、组件设计与目录结构,无任何自定义野路子。
|
|
11
|
+
适用:Svelte 5 + SvelteKit 2/3(纯 Svelte / SvelteKit 通用)
|
|
12
|
+
一、项目结构规范(官方标准)
|
|
13
|
+
纯 Svelte 5 项目结构
|
|
14
|
+
plaintext
|
|
15
|
+
src/
|
|
16
|
+
├── components/ # 可复用 UI 组件(官方推荐)
|
|
17
|
+
├── lib/ # 工具函数、业务逻辑、TS 类型(官方固定目录)
|
|
18
|
+
├── App.svelte # 根组件
|
|
19
|
+
├── main.ts # 入口挂载文件
|
|
20
|
+
└── app.css # 全局样式
|
|
21
|
+
SvelteKit + Svelte 5 项目结构
|
|
22
|
+
plaintext
|
|
23
|
+
src/
|
|
24
|
+
├── routes/ # 路由页面(官方强制)
|
|
25
|
+
├── lib/ # 工具、组件、store、工具函数(官方强制)
|
|
26
|
+
│ ├── components/ # 公共组件
|
|
27
|
+
│ ├── stores/ # 全局状态
|
|
28
|
+
│ └── utils/ # 工具函数
|
|
29
|
+
└── app.html # 入口 HTML(官方固定)
|
|
30
|
+
官方强制规则:
|
|
31
|
+
工具 / 共享代码必须放在 src/lib/
|
|
32
|
+
禁止随意创建根目录(如 utils/、helpers/)
|
|
33
|
+
组件必须放在 lib/components/ 或同级路由内
|
|
34
|
+
二、响应式规范(Svelte 5 官方唯一标准:$ 响应式)
|
|
35
|
+
1. 声明响应式变量(官方唯一写法)
|
|
36
|
+
svelte
|
|
37
|
+
<script lang="ts">
|
|
38
|
+
// 基础响应式
|
|
39
|
+
let count = $state(0);
|
|
40
|
+
|
|
41
|
+
// 对象/数组(无需 $state.raw,Svelte 5 自动深度响应式)
|
|
42
|
+
let user = $state({ name: 'Svelte', age: 5 });
|
|
43
|
+
</script>
|
|
44
|
+
2. 计算属性(官方 $derived)
|
|
45
|
+
svelte
|
|
46
|
+
<script lang="ts">
|
|
47
|
+
let count = $state(0);
|
|
48
|
+
|
|
49
|
+
// 计算属性:自动依赖追踪
|
|
50
|
+
const double = $derived(count * 2);
|
|
51
|
+
</script>
|
|
52
|
+
3. 副作用(官方 $effect)
|
|
53
|
+
svelte
|
|
54
|
+
<script lang="ts">
|
|
55
|
+
let count = $state(0);
|
|
56
|
+
|
|
57
|
+
// 依赖变化时执行
|
|
58
|
+
$effect(() => {
|
|
59
|
+
console.log('count changed:', count);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// 挂载时执行一次
|
|
63
|
+
$effect(() => {
|
|
64
|
+
console.log('mounted');
|
|
65
|
+
return () => console.log('destroyed');
|
|
66
|
+
});
|
|
67
|
+
</script>
|
|
68
|
+
官方禁止:
|
|
69
|
+
禁止使用 Svelte 4 的 $: 语法(已废弃)
|
|
70
|
+
禁止手动实现响应式
|
|
71
|
+
禁止使用第三方响应式库替代原生 API
|
|
72
|
+
三、Props 传参规范(官方 $props())
|
|
73
|
+
svelte
|
|
74
|
+
<script lang="ts">
|
|
75
|
+
// 官方标准 Props 声明
|
|
76
|
+
const { title = '默认标题', count } = $props<{
|
|
77
|
+
title?: string;
|
|
78
|
+
count: number;
|
|
79
|
+
}>();
|
|
80
|
+
</script>
|
|
81
|
+
规则:
|
|
82
|
+
Props 必须使用 $props() 声明
|
|
83
|
+
必须使用 TS 泛型约束类型
|
|
84
|
+
禁止使用 export let(Svelte 5 兼容但不推荐)
|
|
85
|
+
四、事件规范(官方标准)
|
|
86
|
+
1. 子传父(官方 createEventDispatcher)
|
|
87
|
+
svelte
|
|
88
|
+
<script lang="ts">
|
|
89
|
+
import { createEventDispatcher } from 'svelte';
|
|
90
|
+
const dispatch = createEventDispatcher();
|
|
91
|
+
|
|
92
|
+
function send() {
|
|
93
|
+
dispatch('message', { text: 'hello' });
|
|
94
|
+
}
|
|
95
|
+
</script>
|
|
96
|
+
2. 父组件监听
|
|
97
|
+
svelte
|
|
98
|
+
<Child on:message={(e) => console.log(e.detail)} />
|
|
99
|
+
五、状态管理规范(Svelte 5 官方)
|
|
100
|
+
1. 组件内状态:$state
|
|
101
|
+
2. 全局共享状态:$state + 导出(官方标准)
|
|
102
|
+
ts
|
|
103
|
+
// src/lib/stores/appStore.ts
|
|
104
|
+
export const theme = $state('light');
|
|
105
|
+
export const user = $state(null);
|
|
106
|
+
官方规则:
|
|
107
|
+
全局状态直接使用 $state 声明并导出
|
|
108
|
+
无需第三方库
|
|
109
|
+
状态文件放在 src/lib/stores/
|
|
110
|
+
六、TypeScript 规范(官方强制)
|
|
111
|
+
所有文件必须使用 lang="ts"
|
|
112
|
+
svelte
|
|
113
|
+
<script lang="ts">
|
|
114
|
+
禁止使用 any
|
|
115
|
+
接口 / 类型放在 src/lib/types/
|
|
116
|
+
Props、事件、返回值必须强类型定义
|
|
117
|
+
七、组件规范(官方)
|
|
118
|
+
1. 组件命名:大驼峰
|
|
119
|
+
Button.svelte、UserForm.svelte
|
|
120
|
+
2. 样式规范:优先使用 Tailwind 原子类
|
|
121
|
+
- 优先使用 Tailwind CSS v4 原子类(遵循 Tailwind CSS v4 规范)
|
|
122
|
+
- 少量组件特有样式可使用 `<style scoped>`(避免污染全局)
|
|
123
|
+
- 禁止大量自定义原生 CSS 替代原子类
|
|
124
|
+
svelte
|
|
125
|
+
<!-- 推荐:优先使用 Tailwind 原子类 -->
|
|
126
|
+
<div class="relative w-full p-4 flex items-center gap-2 rounded-lg bg-white">
|
|
127
|
+
<slot />
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<!-- 仅对组件特有样式使用 scoped -->
|
|
131
|
+
<style>
|
|
132
|
+
.special-effect { }
|
|
133
|
+
</style>
|
|
134
|
+
3. 逻辑规范
|
|
135
|
+
业务逻辑与 UI 分离
|
|
136
|
+
复杂逻辑抽离到 src/lib/
|
|
137
|
+
组件只做 UI 渲染
|
|
138
|
+
八、指令规范(官方原生)
|
|
139
|
+
{#if}
|
|
140
|
+
{#each}
|
|
141
|
+
{#snippet}(Svelte 5 官方插槽)
|
|
142
|
+
{#key}
|
|
143
|
+
禁止使用第三方指令 / 自定义语法扩展
|
|
144
|
+
九、Svelte 5 废弃语法(严禁使用)
|
|
145
|
+
❌ 禁止 $: 计算属性
|
|
146
|
+
❌ 禁止 export let props
|
|
147
|
+
❌ 禁止 <slot key={}> 旧插槽
|
|
148
|
+
❌ 禁止手动 onMount、beforeUpdate(改用 $effect)
|
|
149
|
+
十、Svelte 5 + Tauri + Svelte Flow 联合规范
|
|
150
|
+
前端 UI:遵循 Svelte 5 官方
|
|
151
|
+
流程图:遵循 Svelte Flow 官方
|
|
152
|
+
桌面能力:遵循 Tauri 官方
|
|
153
|
+
IPC 调用:Tauri 官方 invoke
|
|
154
|
+
状态:Svelte 5 $state
|
|
155
|
+
十一、AI 编码强制规则
|
|
156
|
+
必须使用 **Svelte 5 官方 $ 响应式**($state/$derived / $effect\)
|
|
157
|
+
Props 必须使用 $props()
|
|
158
|
+
共享状态必须放在 src/lib/stores/
|
|
159
|
+
工具函数必须放在 src/lib/utils/
|
|
160
|
+
组件必须放在 src/lib/components/
|
|
161
|
+
禁止使用任何 Svelte 4 废弃语法
|
|
162
|
+
必须使用 TypeScript
|
|
163
|
+
总结(Svelte 5 官方核心 4 条)
|
|
164
|
+
响应式:$state / $derived / $effect
|
|
165
|
+
Props:$props()
|
|
166
|
+
目录:src/lib/ 为唯一共享目录
|
|
167
|
+
无第三方响应式 / 无旧语法
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
---
|
|
2
|
+
description:
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
enabled: true
|
|
5
|
+
updatedAt: 2026-05-13T04:27:39.806Z
|
|
6
|
+
provider:
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Svelte Flow 项目编码规范(严格遵循 xyflow 官方文档规范)
|
|
10
|
+
适用:@xyflow/svelte 官方标准 | Svelte 4 / Svelte 5 | TypeScript所有规则完全对齐官方 API、官方最佳实践,不自定义野写法。
|
|
11
|
+
一、依赖与版本规范(官方标准)
|
|
12
|
+
唯一官方包:@xyflow/svelte,不安装旧版拆分包、不混用 ReactFlow 依赖。
|
|
13
|
+
始终使用官方稳定版,不装 beta/rc 预发布版。
|
|
14
|
+
安装命令(官方推荐):
|
|
15
|
+
bash
|
|
16
|
+
运行
|
|
17
|
+
pnpm add @xyflow/svelte
|
|
18
|
+
# 或 npm/yarn
|
|
19
|
+
npm install @xyflow/svelte
|
|
20
|
+
样式引入遵循官方:全局仅引入一次官方内置样式
|
|
21
|
+
ts
|
|
22
|
+
import '@xyflow/svelte/dist/style.css';
|
|
23
|
+
二、项目目录结构(官方组件分层规范)
|
|
24
|
+
严格按官方「画布 - 节点 - 边 - 类型 - 工具」分层,组件统一放在 src/lib/components/ 下(遵循 Svelte 5 官方标准):
|
|
25
|
+
plaintext
|
|
26
|
+
src/
|
|
27
|
+
├── lib/
|
|
28
|
+
│ ├── xyflow/
|
|
29
|
+
│ │ ├── types.ts # 官方衍生 TS 类型定义
|
|
30
|
+
│ │ ├── node-types.ts # 注册自定义节点类型(官方 nodeTypes 规范)
|
|
31
|
+
│ │ ├── edge-types.ts # 注册自定义边类型(官方 edgeTypes 规范)
|
|
32
|
+
│ │ └── constants.ts # 画布默认配置、网格、缩放常量
|
|
33
|
+
│ ├── components/
|
|
34
|
+
│ │ └── xyflow/
|
|
35
|
+
│ │ ├── FlowCanvas.svelte # 根画布容器(官方 SvelteFlow 入口)
|
|
36
|
+
│ │ ├── nodes/ # 所有自定义节点组件
|
|
37
|
+
│ │ │ ├── InputNode.svelte
|
|
38
|
+
│ │ │ ├── DefaultNode.svelte
|
|
39
|
+
│ │ │ └── OutputNode.svelte
|
|
40
|
+
│ │ └── edges/ # 所有自定义边组件
|
|
41
|
+
│ │ └── CustomEdge.svelte
|
|
42
|
+
│ └── stores/
|
|
43
|
+
│ └── flowStore.ts # 遵循官方不可变规则管理 nodes / edges
|
|
44
|
+
└── ...
|
|
45
|
+
三、基础 API 使用规范(严格对齐官方)
|
|
46
|
+
1. SvelteFlow 组件属性规范
|
|
47
|
+
只使用官方原生 Props,不私自封装冗余属性;必须遵循官方默认行为:
|
|
48
|
+
panOnDrag、zoomOnScroll 官方默认行为保留
|
|
49
|
+
fitView 仅初始化按需使用
|
|
50
|
+
snapToGrid、snapGrid 严格按官方类型传值
|
|
51
|
+
官方标准模板(Svelte 5 语法 + Tailwind)
|
|
52
|
+
svelte
|
|
53
|
+
<script lang="ts">
|
|
54
|
+
import { SvelteFlow, Controls, MiniMap, Background } from '@xyflow/svelte';
|
|
55
|
+
import '@xyflow/svelte/dist/style.css';
|
|
56
|
+
import { nodeTypes } from '$lib/xyflow/node-types';
|
|
57
|
+
import type { Node, Edge } from '@xyflow/svelte';
|
|
58
|
+
|
|
59
|
+
const { nodes = $bindable(), edges = $bindable() } = $props<{
|
|
60
|
+
nodes?: Node[];
|
|
61
|
+
edges?: Edge[];
|
|
62
|
+
}>();
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<!-- 优先使用 Tailwind 原子类 -->
|
|
66
|
+
<div class="w-full h-full min-h-[600px]">
|
|
67
|
+
<SvelteFlow
|
|
68
|
+
bind:nodes
|
|
69
|
+
bind:edges
|
|
70
|
+
{nodeTypes}
|
|
71
|
+
fitView
|
|
72
|
+
panOnDrag={true}
|
|
73
|
+
zoomOnScroll={true}
|
|
74
|
+
snapToGrid={false}
|
|
75
|
+
>
|
|
76
|
+
<Controls />
|
|
77
|
+
<MiniMap />
|
|
78
|
+
<Background />
|
|
79
|
+
</SvelteFlow>
|
|
80
|
+
</div>
|
|
81
|
+
2. 容器布局强制规则(官方硬性要求)
|
|
82
|
+
官方文档明确:SvelteFlow 必须挂载在有明确宽高的父容器内
|
|
83
|
+
禁止无高度容器、禁止仅靠内容自适应
|
|
84
|
+
所有画布外层容器必须定义 width / height
|
|
85
|
+
四、节点(Node)官方规范
|
|
86
|
+
1. 节点结构遵循官方标准字段
|
|
87
|
+
必须严格遵循官方 Node 类型结构:
|
|
88
|
+
ts
|
|
89
|
+
interface Node {
|
|
90
|
+
id: string;
|
|
91
|
+
type?: string;
|
|
92
|
+
position: { x: number; y: number };
|
|
93
|
+
data: Record<string, any>;
|
|
94
|
+
selected?: boolean;
|
|
95
|
+
dragging?: boolean;
|
|
96
|
+
}
|
|
97
|
+
不得私自新增顶层自定义字段,自定义数据全部放在 data 内部
|
|
98
|
+
id 全局唯一,遵循官方唯一标识规则
|
|
99
|
+
2. Handle 连接点官方规范
|
|
100
|
+
严格区分官方两种类型:
|
|
101
|
+
type="target":入边 接收连接
|
|
102
|
+
type="source":出边 发起连接
|
|
103
|
+
位置仅使用官方枚举 Position.Left/Right/Top/Bottom
|
|
104
|
+
自定义节点内 只能渲染 Handle + UI,不写业务逻辑、不写状态变更
|
|
105
|
+
官方标准自定义节点模板(Svelte 5 语法):
|
|
106
|
+
svelte
|
|
107
|
+
<script lang="ts">
|
|
108
|
+
import { Handle, Position } from '@xyflow/svelte';
|
|
109
|
+
import type { NodeProps } from '@xyflow/svelte';
|
|
110
|
+
|
|
111
|
+
const { data } = $props<{
|
|
112
|
+
data: NodeProps['data'];
|
|
113
|
+
}>();
|
|
114
|
+
</script>
|
|
115
|
+
|
|
116
|
+
<div class="custom-node">
|
|
117
|
+
<Handle type="target" position={Position.Left} />
|
|
118
|
+
<span>{data.label}</span>
|
|
119
|
+
<Handle type="source" position={Position.Right} />
|
|
120
|
+
</div>
|
|
121
|
+
五、自定义节点 / 边 注册规范(官方 nodeTypes /edgeTypes)
|
|
122
|
+
必须在单独 node-types.ts 集中注册,遵循官方映射规则
|
|
123
|
+
键名对应节点 type 字段,值为 Svelte 组件
|
|
124
|
+
ts
|
|
125
|
+
// $lib/xyflow/node-types.ts
|
|
126
|
+
import InputNode from '$components/xyflow/nodes/InputNode.svelte';
|
|
127
|
+
import DefaultNode from '$components/xyflow/nodes/DefaultNode.svelte';
|
|
128
|
+
|
|
129
|
+
// 官方标准 nodeTypes 导出
|
|
130
|
+
export const nodeTypes = {
|
|
131
|
+
input: InputNode,
|
|
132
|
+
default: DefaultNode
|
|
133
|
+
};
|
|
134
|
+
使用时直接传给 <SvelteFlow {nodeTypes} />,完全遵循官方注册机制。
|
|
135
|
+
六、状态更新不可变规范(官方核心原则)
|
|
136
|
+
官方明确:禁止直接变异 nodes /edges 数组✅ 正确(官方推荐不可变更新)
|
|
137
|
+
ts
|
|
138
|
+
// 新增
|
|
139
|
+
nodes = [...nodes, newNode];
|
|
140
|
+
// 更新
|
|
141
|
+
nodes = nodes.map(n => n.id === id ? {...n, data: newData} : n);
|
|
142
|
+
// 删除
|
|
143
|
+
nodes = nodes.filter(n => n.id !== id);
|
|
144
|
+
❌ 禁止
|
|
145
|
+
ts
|
|
146
|
+
nodes.push()
|
|
147
|
+
nodes.splice()
|
|
148
|
+
nodes[index] = xxx
|
|
149
|
+
统一用 store 管理,严格遵守官方不可变数据流。
|
|
150
|
+
七、事件回调规范(官方原生事件)
|
|
151
|
+
仅使用官方内置回调,不封装自定义事件透传:
|
|
152
|
+
onConnect 连线创建
|
|
153
|
+
onNodeClick 节点点击
|
|
154
|
+
onPaneClick 画布空白点击
|
|
155
|
+
onNodesChange / onEdgesChange 官方数据流变更
|
|
156
|
+
所有事件逻辑写在 FlowCanvas 父组件,自定义节点只做 UI 展示,符合官方组件设计思想。
|
|
157
|
+
八、TypeScript 类型规范(官方类型优先)
|
|
158
|
+
所有节点、边、位置、Handle 类型全部导入官方内置类型
|
|
159
|
+
ts
|
|
160
|
+
import type {
|
|
161
|
+
Node, Edge, NodeProps, EdgeProps,
|
|
162
|
+
Position, Connection
|
|
163
|
+
} from '@xyflow/svelte';
|
|
164
|
+
不使用 any,自定义业务数据基于官方 data 扩展接口
|
|
165
|
+
禁止私自改写官方类型定义,如需扩展采用交叉类型
|
|
166
|
+
九、样式与主题规范
|
|
167
|
+
仅引入官方样式一次,不重复导入
|
|
168
|
+
自定义节点样式优先使用 Tailwind CSS v4 原子类(遵循 Tailwind CSS v4 规范)
|
|
169
|
+
少量组件特有样式可使用 <style scoped>(避免污染全局)
|
|
170
|
+
画布内置控件(Controls、MiniMap、Background)直接使用官方组件,不自己复刻
|
|
171
|
+
十、AI 编码强制约束(基于官方规范)
|
|
172
|
+
新增节点必须放入 components/xyflow/nodes 并在 node-types.ts 注册;
|
|
173
|
+
更新 nodes/edges 严格使用不可变替换,禁止原地变异;
|
|
174
|
+
SvelteFlow 父容器必须设置固定宽高,遵循官方布局要求;
|
|
175
|
+
自定义节点仅允许包含 Handle + UI,业务逻辑统一放在外层画布 / Store;
|
|
176
|
+
所有类型、事件、属性只使用官方原生 API,不造私有语法。
|